while (g_hash_table_iter_next (&hash_iter, &key, &value))
{
const char *checksum = value;
-
- if (!ostree_repo_traverse_commit_union (self, checksum, depth, data.reachable,
- cancellable, error))
+ OstreeRepoCommitState commitstate;
+ GError *local_error = NULL;
+
+ if (!ostree_repo_load_commit (self, checksum, NULL, &commitstate,
+ error))
goto out;
+
+ if (!ostree_repo_traverse_commit_union (self, checksum, depth, data.reachable,
+ cancellable, &local_error))
+ {
+ /* Don't fail traversing a partial commit */
+ if ((commitstate & OSTREE_REPO_COMMIT_STATE_PARTIAL) > 0 &&
+ g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
+ {
+ g_clear_error (&local_error);
+ }
+ else
+ {
+ g_propagate_error (error, local_error);
+ goto out;
+ }
+ }
}
}
GVariant *serialized_key = key;
const char *checksum;
OstreeObjectType objtype;
+ OstreeRepoCommitState commitstate;
+ GError *local_error = NULL;
ostree_object_name_deserialize (serialized_key, &checksum, &objtype);
if (objtype != OSTREE_OBJECT_TYPE_COMMIT)
continue;
-
- if (!ostree_repo_traverse_commit_union (self, checksum, depth, data.reachable,
- cancellable, error))
+
+ if (!ostree_repo_load_commit (self, checksum, NULL, &commitstate,
+ error))
goto out;
+
+ if (!ostree_repo_traverse_commit_union (self, checksum, depth, data.reachable,
+ cancellable, &local_error))
+ {
+ /* Don't fail traversing a partial commit */
+ if ((commitstate & OSTREE_REPO_COMMIT_STATE_PARTIAL) > 0 &&
+ g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
+ {
+ g_clear_error (&local_error);
+ }
+ else
+ {
+ g_propagate_error (error, local_error);
+ goto out;
+ }
+ }
}
}